/**
 * 在时间轴上控制事件发生
 在事件被触发 n 秒后再执行回调，如果在这 n 秒内事件又被触发，则重新计时。一定是在这n秒内没有触发事件才会执行回调
 */
/**
 * 第一版
 */
function debounce(func, wait) {
    var timeout;
    // console.log(this);
    return function () {
        //绑定this
        var context = this;
        //   console.log(this);
        clearTimeout(timeout)
        timeout = setTimeout(function () {
            func.apply(context)
        }, wait);
    }
}
let obj = {
    a: 12
};
obj.fn = debounce(handler, 1000);
obj.fn();
function handler(e) {
    console.log(this.a);
}

/**
 * 第二版,增加了传递的参数，有时可能会用到event对象
 */
function debounce(fn, timeout) {
    let timer;
    return function (...args) {
        let context = this;
        clearTimeout(timer);
        timer = setTimeout(function () {
            fn.apply(context, args);
        }, timeout)
    }
}